package com.atde._03_creational_design_patterns.singleton.type01;

import org.w3c.dom.ls.LSOutput;

/**
 * @BelongsProject: hsp_java_design_mode
 * @BelongsPackage: com.atde._03_creational_design_patterns.singleton.type01
 * @Author: Del
 * @CreateTime: 2025-05-26  01:41
 * @Description: 单例模式写法1 -- 饿汉式（静态常量）
 * @Version: 1.0
 */
public class SingletonTest01 {
    public static void main(String[] args) {
        // 测试
        Singleton instance = Singleton.getInstance();
        Singleton singleton  = Singleton.getInstance();

        System.out.println(instance == singleton);
    }
}


/**
 * 饿汉式（静态变量）
 * 1） 优点: 这种写法比较简单，就是在类装载的时候就完成初始化。避免了线程同步问题。
 * 2） 缺点：在类装载的时候就完成实例化，没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例，则会造成内存的浪费
 * 3） 这种方式基于classolder机制避免了多线程的同步问题，不过，Instance在类装载时就实例化，在单例模式中大多数都是调用getInstance方法，但是导致类装载
 * 的原因有很多种，因此不能确定有其他的方式（或者其他的静态方法）导致类装载，这时候初始化Instance就没有达到lazy Loading 的效果
 * 4） 结论：这种单例模式可用，但是可能造成内存浪费
 */
class Singleton {

    // 1. 构造器私有化， 外部不能new
    private Singleton() {

    }

    // 2. 在本类内部创建对象实例
    private final static Singleton instance = new Singleton();

    // 3. 对外提供一个静态方法，返回实例对象
    public static Singleton getInstance() {
        return instance;
    }
}
